查看原文
其他

Android 利用Gradle实现差异化构建

EoniJJ 鸿洋 2019-04-05

本文作者


本文由EoniJJ投稿。

EoniJJ的博客地址:

http://www.jianshu.com/u/a453837f8802


1

引言



最近项目中引用的第三方库越来越多,其中一些只在开发中才需要,在正式版本中虽然没开启,但仍被打包进了apk包中,使apk包中增加了无用的代码,本文便是为了解决此问题。


dependencies的多种方式


首先我们先来回顾一下在gradle中的多种dependencies方式。




  • Compile 默认的依赖方式,任何情况下都会依赖。

  • Provided 只提供编译时依赖,打包时不会添加进去。

  • Apk 只在打包Apk包时依赖,这个应该是比较少用到的。

  • TestCompile 只在测试时依赖

  • DebugCompile 只在Debug构建时依赖

  • ReleaseCompile 只在Release构建时依赖


2

实现差异化构建


这里我们以facebook的stetho为例子,现假如我们只需要在开发的时候使用stetho,而在正式上线时不使用,我们可以这样写




通常我们会在Application中进行初始化Sdk的操作



这样写在我们将依赖方式改成debugCompile后会发现正式打包release的时候会编译失败,因为正式打包时并不会将debugCompile的内容打包进去,而Application中又包含了相关的代码,所以便会提示找不到xx类。


这里我们在src目录下建立debug目录和release目录,并在这两个目录下面建立一个SdkManager类。





这里要注意debug和release的包结构需要相同,且不能在main目录下仍有相同的类。


SdkManager的代码很简单,debug中的SdkManager如下:

public class SdkManager {    public static void init(Context context) {        Stetho.initializeWithDefaults(context);    } }


因为我们release中不需要进行依赖,故release中的SdkManager便没作其他操作,大家也可以根据实际需求,如有什么是需要仅在release下使用的,便可以在这里进行操作。


release中的SdkManager如下:

public class SdkManager {    public static void init(Context context) {    } }


然后在Application中我们只需这样调用

public class TestApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        SdkManager.init(this);    } }


这样我们便完成了简单的差异化构建。


3
在module中实现差异化构建


考虑到在项目中我们很可能很多个moudule,在module中又要实现差异化构建,这里我们也新建一个名为testlibrary的module实践一下




-主工程的build.gradle-


这里我们在主工程中对moudule进行依赖,并且在module中采用debugCompile方式依赖第三方的库



-module的build.gradle-


然后编译,会发现直接提示错误




这是因为主工程依赖子module时默认依赖的是子module的release版本,而我们的第三方库仅在debug下进行依赖,即debug版本的主工程依赖的是release版本的module,所以肯定会编译失败,提示找不到xx类。


那么我们只需要让主工程在debug版本下依赖module的debug版本,在release下依赖module的release版本即可解决问题。


首先在module的build.gradle文件中,增加 publishNonDefault true ,让module不再按默认只构建release版本

android {     ...    publishNonDefault true } dependencies {    ...    debugCompile 'com.facebook.stetho:stetho:1.4.2' }


在主工程的build.gradle中,增加如下代码:



重新编译,即可编译通过。


这里我们只是举了简单的例子,实际开发中大家可能会有各种各样的productFlavors,在不同的productFlavors中依赖也可能不同,但实现差异化构建的方法都是一样的,这里就不一一展开进行说明了。

ZZS

无论你是有 Java 基础希望学 Android 开发的程序员,还是想进一步提升能力的 Android 开发者,都可以在这个Udacity & Google 官方参与制作 的课程项目中找到适合自己的成长路径!



*独家硅谷技术课程

*行业领导者设计的实战项目

*一对一学习辅导

*名企颁发学习认证

*毕业直达滴滴面试


如果你有想学习的文章直接留言,我会整理征稿。如果你有好的文章想和大家分享欢迎投稿,直接向我投递文章链接即可。


欢迎长按下图->识别图中二维码或者扫一扫关注我的公众号:

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存